package dao;

import java.util.Date;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import dominio.Cliente;
import dominio.ItemSolicitudCotizacion;
import dominio.Rodamiento;
import dominio.SolicitudCotizacion;
import utils.DateUtils;
import utils.XmlUtils;

public class SolicitudCotizacionXmlDAO {
	private static SolicitudCotizacionXmlDAO instance;

	public static SolicitudCotizacionXmlDAO getInstance() {
		if (instance == null)
			instance = new SolicitudCotizacionXmlDAO();
		return instance;
	}

	private SolicitudCotizacionXmlDAO() {}

	public SolicitudCotizacion parse(Document xml) throws Exception {
		// Solicitud Cotizacion
		Element elementSolicitud = XmlUtils.getElement(xml, "SolicitudCotizacion");
		if (elementSolicitud != null) {
			SolicitudCotizacion solicitud = new SolicitudCotizacion();
			// Fecha
			Date fecha = DateUtils.parse(elementSolicitud.getAttribute("fecha"));
			solicitud.setFecha(fecha);
			// Cliente
			Cliente cliente = XmlUtils.parseCliente(elementSolicitud);
			solicitud.setCliente(cliente);
			// Rodamientos
			Element rodamientos = XmlUtils.getElement(elementSolicitud, "Rodamientos");
			if (rodamientos != null) {
				NodeList items = rodamientos.getElementsByTagName("Item");
				for (int i = 0; i < items.getLength(); ++i) {
					Element item = (Element) items.item(i);
					solicitud.agregarItem(parseItem(item));
				}
				return solicitud;
			}
		}
		throw new Exception("Formato incorrecto del archivo XML.");
	}

	private ItemSolicitudCotizacion parseItem(Element item) throws Exception {
		// Serie
		String serie = item.getAttribute("serie");
		// Sufijo
		Element elementSufijo = XmlUtils.getElement(item, "Sufijo");
		// Marca
		Element elementMarca = XmlUtils.getElement(item, "Marca");
		// Pais
		Element elementPais = XmlUtils.getElement(item, "Origen");
		// Cantidad
		Element elementCantidad = XmlUtils.getElement(item, "Cantidad");
		if (serie != null && elementSufijo != null && elementMarca != null && elementPais != null && elementCantidad != null) {
			ItemSolicitudCotizacion i = new ItemSolicitudCotizacion();
			// Rodamiento
			Rodamiento r = new Rodamiento();
			r.setSerie(serie);
			r.setSufijo(elementSufijo.getTextContent());
			r.setMarca(elementMarca.getTextContent());
			r.setPais(elementPais.getTextContent());
			i.setRodamiento(r);
			// Cantidad
			i.setCantidad(Integer.parseInt(elementCantidad.getTextContent()));
			return i;
		}
		throw new Exception("Formato incorrecto del archivo XML.");
	}
}